package top.shiyiri.file;

import org.junit.Test;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;

/**
 * @author Aunean
 * @date 2022/1/9
 */
/*
File类的使用
1.File类的一个对象，代表一个文件或一个文件夹
2.File类声明在java.io包下
3.File类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法
    如果需要读取或写入文件内容，必须使用IO流来完成
4.后续File类的对象常会作为参数传递到流的构造器中，指明读取或写入的 “终点”

 */
public class FileTest {

    /*
    1.如何创建File类的实例
        File(String filePath)
        File(String parentPath, String childPath)
        File(File parentFile)

    2.相对路径：相较于某个路径下，指明的路径
    绝对路径：包含盘符在内的文件或文件目录的路径

    3.路径分隔符
    windows：\\
    unix：/
     */
    @Test
    public void test1() {
        //构造器一
        File file1 = new File("data/hello.txt.txt");//相对路径
        File file2 = new File("D:\\shangguiguProject\\JavaProject\\data\\hello.txt.txt");//绝对路径

        System.out.println(file1);

        //构造器二
        File file3 = new File("D:\\shangguiguProject", "JavaProject");

        //构造器三
        File file4 = new File(file3, "data/hello.txt.txt");

    }

    /*
    public String getAbsolutePath()：获取绝对路径
    public String getPath()：获取路径
    public String getName()：获取名称
    public String getParent()：获取上层文件目录路径。若无，返回null
    public long length()：获取文件长度（即：字节数）。不能获取目录的长度。  public long lastModified() ：获取最后一次的修改时间，毫秒值
    public long lastModified()：获取最后一次的修改时间，毫秒值
     */

    @Test
    public void test2() {
        File file1 = new File("../data/hello.txt");
        File file2 = new File("D:/word");

        System.out.println(file1.getAbsolutePath());
        System.out.println(file1.getPath());
        System.out.println(file1.getName());
        System.out.println(file1.getParent());
        System.out.println(file1.length());
        System.out.println(file1.lastModified());

        System.out.println();

        System.out.println(file2.getAbsolutePath());
        System.out.println(file2.getPath());
        System.out.println(file2.getName());
        System.out.println(file2.getParent());
        System.out.println(file2.length());
        System.out.println(file2.lastModified());
    }

    /*
    public String[] list()：获取指定目录下的所有文件或者文件目录的名称数组
    public File[] listFiles()：获取指定目录下的所有文件或者文件目录的File数组
     */
    @Test
    public void test3() {
        File file1 = new File("D:\\shangguiguProject\\JavaProject");
        String[] list = file1.list();

        System.out.println(Arrays.toString(list));

        File[] files = file1.listFiles();
        assert files != null;
        for (File file: files) {
            System.out.println(file);
        }
    }

    /*
    public boolean renameTo(File dest):把文件重命名为指定的文件路径
    要保证返回 true，需要 file1 在硬盘中是存在的，且 file2 不能在硬盘中存在
     */
    @Test
    public void test4() {
        File file1 = new File("../data/hello.txt.txt");
        File file2 = new File("D:/word/hi.txt");

        boolean rename = file1.renameTo(file2);
        System.out.println(rename);
    }


    /*
    public boolean isDirectory()：判断是否是文件目录
    public boolean isFile()：判断是否是文件
    public boolean exists()：判断是否存在
    public boolean canRead()：判断是否可读
    public boolean canWrite()：判断是否可写
    public boolean isHidden()：判断是否隐藏
     */
    @Test
    public void test5() {
        File file1 = new File("../data/hello.txt.txt");

        System.out.println(file1.isDirectory());
        System.out.println(file1.isFile());
        System.out.println(file1.exists());
        System.out.println(file1.canRead());
        System.out.println(file1.canWrite());
        System.out.println(file1.isHidden());

        System.out.println();
        File file2 = new File("../data");

        System.out.println(file2.isDirectory());
        System.out.println(file2.isFile());
        System.out.println(file2.exists());
        System.out.println(file2.canRead());
        System.out.println(file2.canWrite());
        System.out.println(file2.isHidden());
    }

    /*
    public boolean createNewFile() ：创建文件。若文件存在，则不创建，返回false
    public boolean mkdir() ：创建文件目录。如果此文件目录存在，就不创建了。
        如果此文件目录的上层目录不存在，也不创建。
    public boolean mkdirs() ：创建文件目录。如果上层文件目录不存在，一并创建

    public boolean delete()：删除文件或者文件夹
     */
    @Test
    public void test6() throws IOException {
        //文件创建
        File file1 = new File("../data/hi.txt");
        if (! file1.exists()) {
            file1.createNewFile();
            System.out.println("创建成功");
        } else {//文件存在
            file1.delete();
            System.out.println("删除成功");
        }
    }

    @Test
    public void test7() {
        //文件目录的创建
        File file1 = new File("../data/io2/io");
        boolean mkdir = file1.mkdir();
        if (mkdir) {
            System.out.println("创建成功");
        }

        boolean mkdirs = file1.mkdirs();
        if (mkdirs) {
            System.out.println("多层目录创建成功");
        }

        //删除目录时该目录下不能有子目录或文件
        boolean delete = file1.delete();
        if (delete) {
            System.out.println("目录删除成功");
        }
    }
}
